package com.sunny.dao.mongo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import com.sunny.util.BeanUtils;

import java.util.List;

/**
 * Created by Sunny on 2016/4/19.
 */
public abstract class BaseDao<T> {

        /**
         * spring mongodb　集成操作类　
         */
        @Autowired
        protected MongoTemplate mongoTemplate;

    public static final String collectionName ="prism_vb";
        /**
         * 通过条件查询实体(集合)
         *
         * @param query
         */
        public List<T> find(Query query, String collectionName) {
            return mongoTemplate.find(query, this.getEntityClass(),collectionName);
        }

        /**
         * 分页通过条件查询实体(集合)
         *
         * @param query
         */
        public List<T> findPageList(Query query,int start,int limit) {
            return mongoTemplate.find(query.skip(start).limit(limit), this.getEntityClass());
        }

        /**
         * 分页通过条件查询实体(集合)
         *
         * @param query
         */
        public List<T> findPageList(Query query,int start,int limit,String collectionName) {
            return mongoTemplate.find(query.skip(start).limit(limit), this.getEntityClass(),collectionName);
        }

        /**
         * 通过一定的条件查询一个实体
         *
         * @param query
         * @return
         */
        public T findOne(Query query) {
            return mongoTemplate.findOne(query, this.getEntityClass());
        }

        /**
         * 查询总条数
         * @author lff
         * 2016年1月26日下午5:57:43
         * @param query
         * @return
         */
        public long count(Query query) {
            return mongoTemplate.count(query, this.getEntityClass());
        }

        /**
         * 总条数，根据表名称
         * @author lff
         * 2016年1月27日上午11:06:54
         * @param query
         * @param collectionName
         * @return
         */
        public long count(Query query,String collectionName) {
            return mongoTemplate.count(query, collectionName);
        }

        /**
         * 通过条件查询更新数据
         *
         * @param query
         * @param update
         * @return
         */
        public void update(Query query, Update update) {
            mongoTemplate.upsert(query, update, this.getEntityClass());
        }

        /**
         * 保存一个对象到mongodb
         *
         * @param bean
         * @return
         */
        public T save(T bean) {
            mongoTemplate.save(bean);
            return bean;
        }

        /**
         * 插入一个对象
         * @author lff
         * 2016年1月26日上午11:56:27
         * @param bean
         * @return
         */
        public T insert(T bean) {
            mongoTemplate.insert(bean);
            return bean;
        }

        /**
         * 根据主键删除
         * @author lff
         * 2016年1月26日下午1:59:56
         * @param bean
         */
        public void del(T bean) {
            mongoTemplate.remove(bean);
        }

        /**
         * 通过ID获取记录
         *
         * @param id
         * @return
         */
        public T get(Object id) {
            return mongoTemplate.findById(id, this.getEntityClass());
        }

        /**
         * 通过ID获取记录,并且指定了集合名(表的意思)
         *
         * @param id
         * @param collectionName
         *            集合名
         * @return
         */
        public T get(Object id, String collectionName) {
            return mongoTemplate.findById(id, this.getEntityClass(), collectionName);
        }

        /**
         * 获取需要操作的实体类class
         *
         * @return
         */
        @SuppressWarnings("unchecked")
        protected  Class<T> getEntityClass(){
            return (Class<T>) BeanUtils.getSuperClassGenricType(getClass(),0);
        };


        public String getCollectionName() {
            return getEntityClass().getSimpleName();
        }

        /**
         * @return the mongoTemplate
         */
        public MongoTemplate getMongoTemplate() {
            return mongoTemplate;
        }

        /**
         * @param mongoTemplate the mongoTemplate to set
         */
        public void setMongoTemplate(MongoTemplate mongoTemplate) {
            this.mongoTemplate = mongoTemplate;
        }

    }
